#!/bin/bash
#========================================================================================
#======================================1、云服务器信息=====================================
# >>>   须知：请提前在宿主机配置SSH免密登录                                            <<<<<<<
# >>>   1、ssh-keygen -t rsa # 只需执行一次，连续按3次回车，之后直接执行第二步            <<<<<<<
# >>>   2、ssh-copy-id -i ~/.ssh/id_rsa.pub 用户名@服务器ip                         <<<<<<<
#========================================================================================

# 前端web页面存放地址
WEB_HOST='这里填写目标前端服务器IP'
WEB_USERNAME='这里填写目标前端服务器用户名'
WEB_SERVER_DIR='这里填写目标前端服务器HTML存放文件夹'
WEB_LOCAL_DIR='这里填写当前前端项目HTML存放文件夹'

# 1、主机1
SERVER_HOST[0]='这里填写目标服务器IP'
SERVER_USERNAME[0]='这里填写登录服务器的用户名'
SERVER_SERVER[0]="A服务,B服务..." # 此处填写的服务名应为服务文件夹名
SERVER_PORT[0]="A服务端口,B服务端口..."

# 2、主机2
#SERVER_HOST[0]='这里填写目标服务器IP'
#SERVER_USERNAME[0]='这里填写登录服务器的用户名'
#SERVER_SERVER[0]="A服务,B服务..." # 此处填写的服务名应为服务文件夹名
#SERVER_PORT[0]="A服务端口,B服务端口..."
#......

#========================================================================================
#======================================2、环境常量配置=====================================
#========================================================================================

# 目标服务器项目根目录（必须提前创建好）
WORK_BASE_DIR='/...'

# 宿主机服务器项目地址（当前执行的Jenkins工作路径下的项目地址）
WORK_LOCAL_DIR='/var/jenkins_home/workspace/...'





#========================================================================================
#========================================================================================
#========================================================================================

# 远程资源传输，向云主机传输jar文件
# 备注：
#   $1 -> 用户名
# 	$2 -> 远程云服务器外网ip
#	  $3 -> 宿主机资源地址
#	  $4 -> Server名
#	  $5 -> 服务端口
sourceCopy(){
# 删除旧项目文件
ssh $2<<EOF
  echo ">>> 正在清理旧项目文件 <<<"
  cd "$WORK_BASE_DIR"
  rm -rf ./$4
  echo ">>> 已清理完毕 <<<"
EOF

echo ">>> 正在传输$4 <<<"
scp -r $3 $1@$2:$WORK_BASE_DIR
echo ">>> 传输完毕 <<<"
ssh $2<<EOF
  cd "$WORK_BASE_DIR/$4"
  echo ">> $2正在停止并删除旧的容器... <<"
  docker ps -a|grep $4 &&  docker stop $4 && docker rm $4 || echo "not exist"
  echo "> $2停止并删除旧的容器成功！ <"
  echo ">> $2正在删除旧镜像... <<"
  docker images |grep  $4  && docker rmi -f $4  || echo  "not exist"
  echo "> $2删除旧镜像成功！ <"
  echo ">> $2正在构建新的镜像... <<"
  JarAddr=$(find ./target/ -name *$4*.jar -print -quit)
  docker build --build-arg JAR_FILE=$JarAddr -t $4  ./
  echo "> $2构建新的镜像完成！ <"
  echo ">> $2正在运行镜像容器... <<"
  docker run -it -d --name $4 --restart=always -p $5:$5 $4
  echo "> $2运行镜像容器成功！ <"
  sysctl -w vm.drop_caches=1
  sysctl -w vm.drop_caches=2
  sysctl -w vm.drop_caches=3
EOF
}


# 清理pagecache（页面缓存）
sysctl -w vm.drop_caches=1
# 清理dentries（目录缓存）和inodes
sysctl -w vm.drop_caches=2
# 清理pagecache、dentries和inodes
sysctl -w vm.drop_caches=3

# 先处理前端页面的部署
# 1、登录前端服务器并且删除前端文件
ssh $WEB_HOST<<EOF
  echo ">>> 正在清理旧项目文件 <<<"
  cd "$WEB_SERVER_DIR"
  rm -rf ./*
  echo ">>> 已清理完毕 <<<"
EOF

# 2、远程传输前端项目文件
scp -r $WEB_LOCAL_DIR $WEB_USERNAME@$WEB_HOST:$WEB_SERVER_DIR

# 循环所有服务器信息，并登录到服务器，执行脚本
for ((i=0;i<${#SERVER_HOST[*]};i++))
do
  echo ">>> 正在部署第${i+1}台服务器... <<<"
  Host=${SERVER_HOST[i]}
  Username=${SERVER_USERNAME[i]}
  Servers=${SERVER_SERVER[i]}
  echo ">>> HOST:$Host :::  USERNAME:$Username   ::: Servers:$Servers <<<"
  cd $WORK_LOCAL_DIR
  # 切分服务名
  array=(`echo ${Servers} | tr ',' ' '` )
  # 切分服务对应的端口
  ports=(`echo ${SERVER_PORT[i]} | tr ',' ' '` )
  index=0
  for serverName in ${array[@]}
    do
      echo=">>> 服务名：$serverName <<<"
      currentPort=${ports[index]}
      echo ">>> 服务接口：$currentPort <<<"
      findValue=$(find ./ -name ${serverName} -type d -print -quit)
      echo ">>> 服务目录地址：$findValue <<<"
      sourceCopy $Username $Host $findValue $serverName $currentPort
      let index+=1
    done
done
